package com.gl.glbooks.services;

import org.apache.velocity.app.VelocityEngine;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.flex.remoting.RemotingDestination;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.mail.javamail.MimeMessagePreparator;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.ui.velocity.VelocityEngineUtils;
import org.springframework.core.io.Resource;

import com.dumbster.smtp.SimpleSmtpServer;
import com.gl.glbooks.repository.JpaProjectRepository;
import com.gl.glbooks.util.HiloMail;
import com.gl.glbooks.vos.Libro;
import com.gl.glbooks.vos.Sugerencia;
import com.gl.glbooks.vos.Usuario;

import javax.mail.internet.MimeMessage;

import java.sql.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Transactional
public class MailServices implements IMailServices {
		
	   @Autowired
	   private JavaMailSender mailSender;
	   @Autowired
	   private VelocityEngine velocityEngine;
	   private String mensaje;
	   @Autowired
	   private String appUrl;
	   private int pendingMessages = 0;
	   
	   protected static SimpleSmtpServer smtpFakeServer;

		public MailServices() {
			super();
			if(smtpFakeServer == null || smtpFakeServer.isStopped())
				smtpFakeServer = SimpleSmtpServer.start(24);
		}

		public String getAppUrl() {
			return appUrl;
		}

		public void setAppUrl(String appUrl) {
			this.appUrl = appUrl;
		}  
	   
	   @Override
	   public void setMailSender(JavaMailSender mailSender) {
	      this.mailSender = mailSender;
	   }
	   
	   @Override
	   public void setVelocityEngine(VelocityEngine velocityEngine) {
	      this.velocityEngine = velocityEngine;
	   }
	   
	   private void start( HiloMail hilo )
	   {
		   pendingMessages++;
		   hilo.setMailService(this);
		   hilo.start();
	   }
		@Override
		public void mailSent() {
		   pendingMessages--;
		}

		@Override
		public boolean isPendingMail() {
			return pendingMessages > 0;
		}
	   
	   @Override
	   public void libroMalEstado(Usuario user) {
	      this.mensaje = "mensajeLibroMalEstado.vm";
	      start( new HiloMail(user, mensaje, mailSender, velocityEngine) ); 
	   }
	   
	   @Override
	   public void sugerenciaCompra(List<Usuario> users, Sugerencia sugerencia) {
		  this.mensaje = "mensajeSugerenciaCompra.vm";
		  for(Usuario usuario:users){ 
//			  start( new HiloMail(usuario, mensaje, mailSender, velocityEngine, appUrl+"/index.jsp?vista=libros&estado=detalleLibro&libroId=",sugerencia) );
			  start( new HiloMail(usuario, mensaje, mailSender, velocityEngine, appUrl+"/index.jsp?vista=sugerencias&estado=gestionarsugerencia&sugerenciaId=",sugerencia) );
		  }
	   }
	   
	   @Override
		public void avisoAltaLibro(Libro libro, List<Usuario> users) {
			this.mensaje = "mensajeAltaLibro.vm";
			for (final Usuario usuario : users) {
				start( new HiloMail(appUrl+"/index.jsp?vista=libros&estado=detalleLibro&libroId=", libro, usuario, mensaje, mailSender,
						velocityEngine) );
			}
		}
	   
	   @Override
	   public void recomendarLibro(Long id, Usuario user,Usuario from) {
		   this.mensaje = "mensajeRecomendacionLibro.vm";
		   start( new HiloMail(appUrl+"/index.jsp?vista=libros&estado=detalleLibro&libroId=", id, user, from, mensaje, mailSender,velocityEngine) );
	   }
	   
	   @Override
	   public void prestamoPorVencer(Usuario user) {
	      this.mensaje = "mensajePrestamoPorVencer.vm";
	      start( new HiloMail(user, mensaje, mailSender, velocityEngine) ); 
	   }
	   
	   
	   @Override
	   public void avisoAprobarLibro(List<Usuario> users) {
		   this.mensaje = "mensajeAprobarLibro.vm";
		   for(final Usuario usuario : users) {	
		      start( new HiloMail(usuario, mensaje, mailSender, velocityEngine) );
		   }   
	   }
	   
	   @Override
	   public void prestamoVencido(Usuario user) {
	      this.mensaje = "mensajePrestamoVencido.vm";
	      start( new HiloMail(user, mensaje, mailSender, velocityEngine) ); 
	   }
	   
	   
	  
	   @Override
		public void rechazarPdf(Usuario user, String smsRechazado) {
			this.mensaje = "rechazoPdf.vm";
			start( new HiloMail(smsRechazado,user, mensaje, mailSender, velocityEngine) );
		}
		
	   private void sendConfirmationEmail(final Usuario user,final String mensaje) {
		      MimeMessagePreparator preparator = new MimeMessagePreparator() {
		         public void prepare(MimeMessage mimeMessage) throws Exception {
		            MimeMessageHelper message = new MimeMessageHelper(mimeMessage);
		            message.setTo(user.getCorreoElectronico());
		            //message.setTo("octavio_ar21@hotmail.com");
		            message.setFrom("robot@globallogic.com"); // could be parameterized...
		            message.setSubject("Biblioteca");
		            Map model = new HashMap();
		            model.put("user", user);
		            String text = VelocityEngineUtils.mergeTemplateIntoString(
		               velocityEngine, "mail/"+mensaje, model);
		            message.setText(text, true);
		         }
		      };
		      this.mailSender.send(preparator);   
			  System.out.println("envio!!!!"); 
			  pendingMessages--;
	    }


	   


}
